package com.test.utils;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import com.test.models.City;
import com.test.models.Route;
import com.test.storages.DataBase;

/**
 * DataBaseUtils
 * 
 * @author ezuccon
 * @category Utils
 * @version 1.0
 * @since 12/03/2013
 */
public class DataBaseUtils {
	/**
	 * Constructor oculto
	 */
	protected DataBaseUtils() {
		super();
	}

	public static final DataBase generateDataBase() {
		// genera las ciudades
		City a = new City(0, "A", new ArrayList<Route>());
		City b = new City(1, "B", new ArrayList<Route>());
		City c = new City(2, "C", new ArrayList<Route>());
		City d = new City(3, "D", new ArrayList<Route>());
		City e = new City(4, "E", new ArrayList<Route>());

		// genera las rutas
		Route ab5 = new Route(0, a, b, 5);
		a.getRoutes().add(ab5);
		Route bc4 = new Route(1, b, c, 4);
		b.getRoutes().add(bc4);
		Route cd8 = new Route(2, c, d, 8);
		c.getRoutes().add(cd8);
		Route dc8 = new Route(3, d, c, 8);
		d.getRoutes().add(dc8);
		Route de6 = new Route(4, d, e, 6);
		d.getRoutes().add(de6);
		Route ad5 = new Route(5, a, d, 5);
		a.getRoutes().add(ad5);
		Route ce2 = new Route(6, c, e, 2);
		c.getRoutes().add(ce2);
		Route eb3 = new Route(7, e, b, 3);
		e.getRoutes().add(eb3);
		Route ae7 = new Route(8, a, e, 7);
		a.getRoutes().add(ae7);

		// crea un nueva base de datos
		return new DataBase(Arrays.asList(a, b, c, d, e));
	}

	/**
	 * Genera la lista de nombre de ciudades
	 * 
	 * @param dataBase
	 */
	public static final List<String> getCitiesNames(DataBase dataBase) {
		// declara la lista de nombre de ciudades
		List<String> cityNames = new ArrayList<String>();

		// itera sobre la lista de ciudades
		for (City city : dataBase.getCities()) {
			cityNames.add(city.getName());
		}

		// devuelve la lista de nombre de ciudades
		return cityNames;
	}

	/**
	 * Busca un ciudad filtrando por un objeto de ejemplo
	 * 
	 * @param dataBase
	 * @param cityCriteria
	 * @return
	 */
	public static final City findCity(DataBase dataBase, City cityCriteria) {
		// itera sobre la lista de ciudades
		for (City city : dataBase.getCities()) {
			// valida la ciudad por nombre
			if (city.equals(cityCriteria)) {
				// devuelve la ciudad buscada
				return city;
			}
		}

		// devuelve ciudad no encontrada
		return null;
	}
}
